package server.useCases.case1;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import client.bussinesObject.Materia;
import client.useCases.case1.rpc.Case1Service;

import com.awx.client.widget.validation.AwxValidationUtils;
import com.awx.server.service.AwxServiceImpl;


public class Case1ServiceImpl extends AwxServiceImpl implements Case1Service{

	private static List<Materia> materias = new ArrayList<Materia>();
	private static String[] calidades = new String[]{ "Buena", "Muy Buena", "Regular", "Pesima" };
	private static String[] cuatrimestres = new String[]{ "Primero", "Segundo" };

	static {
		Random random = new Random();
		for (int i = 0; i < 50; i++) {
			materias.add( new Materia( "Materia " + (i + 1),
									cuatrimestres[random.nextInt( cuatrimestres.length )],
										calidades[random.nextInt( calidades.length )]));
		}
	}


	public List<Materia> getMaterias(Materia criteria) {
		if( AwxValidationUtils.validateRequired( criteria.getNombre() ) ) {
			return getByName(criteria);

		}

		List<Materia> results = new ArrayList<Materia>();
		if( AwxValidationUtils.validateRequired( criteria.getCalidad() ) ) {
			results.addAll(getByCalidad(criteria));
		}
		if( AwxValidationUtils.validateRequired( criteria.getCalidad() ) ) {
			results.addAll(getByCuatrimestre(criteria));
		}
		return results;
	}



	private List<Materia> getByCuatrimestre(Materia criteria) {
		List<Materia> results = new ArrayList<Materia>();
		for (Materia materia : materias) {
			if( materia.getCuatrimestre().equals( criteria.getCuatrimestre() ) ) {
				results.add( materia );
			}
		}
		return results;
	}

	private List<Materia> getByCalidad(Materia criteria) {
		List<Materia> results = new ArrayList<Materia>();
		for (Materia materia : materias) {
			if( materia.getCalidad().equals( criteria.getCalidad() ) ) {
				results.add( materia );
			}
		}
		return results;
	}

	private List<Materia> getByName(Materia criteria) {
		List<Materia> results = new ArrayList<Materia>();
		for (Materia materia : materias) {
			if( materia.getNombre().equals( criteria.getNombre() ) ) {
				results.add( materia );
				break;
			}
		}
		return results;
	}



}
